From: Rui Matos Date: Tue, 30 Oct 2012 15:46:18 +0000 (+0100) Subject: keyboard: Show in an idle on clutter key focus changes X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~5142 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f07fee538d35695ef24024eb37d8799e2e3744bd;p=gnome-shell.git keyboard: Show in an idle on clutter key focus changes It's common to do actor.grab_key_focus() before the actor is mapped which means that we can't reliably determine where the actor is at notify::key-focus time and thus might end up showing the keyboard on the wrong monitor. This is happening, in particular, with the run dialog. Delaying until we hit the main loop allows us to know where the actor finally is before showing the OSK. https://bugzilla.gnome.org/show_bug.cgi?id=685856 --- diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index 67f00ba34..e3a9a9b36 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -182,6 +182,8 @@ const Keyboard = new Lang.Class({ this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA }); this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged)); this._settingsChanged(); + + this._showIdleId = 0; }, init: function () { @@ -273,10 +275,14 @@ const Keyboard = new Lang.Class({ return; let time = global.get_current_time(); - if (focus instanceof Clutter.Text) - this.Show(time); - else + if (!(focus instanceof Clutter.Text)) { this.Hide(time); + return; + } + + if (!this._showIdleId) + this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, + Lang.bind(this, function() { this.Show(time); })); }, _addKeys: function () { @@ -502,6 +508,13 @@ const Keyboard = new Lang.Class({ return one - two; }, + _clearShowIdle: function() { + if (!this._showIdleId) + return; + GLib.source_remove(this._showIdleId); + this._showIdleId = 0; + }, + // D-Bus methods Show: function(timestamp) { if (!this._enableKeyboard) @@ -510,6 +523,8 @@ const Keyboard = new Lang.Class({ if (this._compareTimestamp(timestamp, this._timestamp) < 0) return; + this._clearShowIdle(); + if (timestamp != Clutter.CURRENT_TIME) this._timestamp = timestamp; this.show(Main.layoutManager.focusIndex); @@ -522,6 +537,8 @@ const Keyboard = new Lang.Class({ if (this._compareTimestamp(timestamp, this._timestamp) < 0) return; + this._clearShowIdle(); + if (timestamp != Clutter.CURRENT_TIME) this._timestamp = timestamp; this.hide();